昨天介紹了numpy的一些方法,今天要繼續深入numpy,事不宜遲,馬上開始吧
numpy除了基本四則運算外也有線性代數的一些矩陣運算,請看範例程式碼
內積(dot)是矩陣運算很基礎的內容,數學原理這邊就不贅述了,可以使用np.dot(array1,array2)
計算array1跟array2的內積
a=np.array([[1,2,3],[4,5,6]])
b=np.array([[1,2],[3,4],[5,6]])
ab=np.dot(a,b)
print(ab)
可看到結果為
[[22 28]
[49 64]]
跟內積一樣,外積(cross)也是矩陣運算很基礎的內容,當我們要計算外積的時候,就可以使用np.cross(array1,array2)
來計算外積
a=np.array([1,2,3])
b=np.array([4,5,6])
ab=np.cross(a,b)
print(ab)
可看到結果為
[-3 6 -3]
numpy也有相關的方法可以計算反矩陣,使用np.linalg.inv(array)
可以計算array的反矩陣,需要注意的是如果陣列是奇異(不可逆)矩陣(singular matrix)的話將會引發錯誤,所以建議使用例外處理來處理
a=np.array([[1,2,3],[1,0,1],[7,8,9]])
try:
inva=np.linalg.inv(a)
except np.linalg.LinAlgError as e:
print(e)
else:
print(inva)
可得結果:
[[-0.66666667 0.5 0.16666667]
[-0.16666667 -1. 0.16666667]
[ 0.66666667 0.5 -0.16666667]]
若為奇異矩陣的話
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
try:
inva=np.linalg.inv(a)
except np.linalg.LinAlgError as e:
print(e)
else:
print(inva)
可看到程式回傳錯誤內容:
Singular matrix
我們可以使用np.linalg.norm(array)
來計算一個向量長度,也可以計算兩個向量之間的歐式距離
a=np.array([1,2,3])
b=np.array([4,5,6])
a=np.linalg.norm(a) #計算a的長度
ab=np.linalg.norm(a-b) #計算a到b的距離
print(a) #3.7416573867739413
print(ab) #2.59812978828652
這邊我列出了我在做專案時較常使用到的計算函數,這幾個應該都算是基礎中的基礎了。
a=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
print(np.min(a)) #求最小值
print(np.max(a)) #求最大值
print(np.ptp(a)) #求最大值最小值的差
print(np.mean(a)) #求平均
print(np.prod(a)) #求累乘乘積
print(np.sum(a)) #求總和
可以看到結果
1
9
8
5.0
362880
45
這些函數中還能再加入axis參數,代表指定維度做計算,axis=0通常代表每一直行,axis=1代表每一橫列,以min為例,如果是二維陣列的話可看到結果如下,每一直行的最小值分別為1,4,7,而每一橫列的最小值分別為1,2,3,其餘的方法也是同理。
a=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
print(np.min(a,axis=0)) #[1 2 3]
print(np.min(a,axis=1)) #[1 4 7]
np.where( )在資料分析中算是是很常用的函數,它可以幫你找出特定條件的元素索引值,例如今天要找大於5的元素,就可以使用np.where()
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(np.where(a>5))
結果為
(array([1, 2, 2, 2], dtype=int64), array([2, 0, 1, 2], dtype=int64))
代表索引值[1,2],[2,0],[2,1],[2,2]的元素都大於5。也可以將這些索引值代表的元素逐一列印出來。例如:
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
index=np.where(a>5)
print(a[index])
結果為
[6 7 8 9]
另外一個用法為滿足條件輸出值,不滿足條件輸出另一個值,參數輸入如下np.where(判斷式,滿足條件的值,不滿足條件的值)
a=np.array([[1,2,3],
[4,5,6],
[7,8,9]])
print(np.where(a>5,1,0))
結果為
[[0 0 0]
[0 0 1]
[1 1 1]]
當陣列需要被儲存以供之後使用的話,可以使用np.save()儲存,日後再用np.load()讀取處存的陣列
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
np.save('your path.npy',a) #輸入要儲存的路徑,副檔名指定為.npy檔案
a=np.load('your path.npy',allow_pickle=True) #讀取npy檔案
今日講了numpy剩餘的一些用法,不過numpy的功能遠遠不止這些,要講可能也講不完。但這些已經可以應付許多實作或者專案等了,明天會介紹如何使用matplotlib.pyplot(plt)來畫出一張圖,針對之後強化學習畫出reward的圖會有幫助。